package servidorudp.src;

import java.io.FileWriter;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import proyectosudp.src.GrupoInvestigacion;
import proyectosudp.src.Proyecto;
import proyectosudp.src.UnidadAcademica;
import proyectosudp.src.Usuario;



/**
 * @author jquinterob
 * @version 1.0
 * @created 01-oct-2011 09:09:30 a.m.
 */
public class Dao {

    ejecutorSQLAvanzado ejeSQLAvanzado = new ejecutorSQLAvanzado("jdbc:odbc:cursoRedes","login","password");
	public Dao(){

	}

	public void finalize() throws Throwable {

	}
	/**
	 * 
	 * @param grupo
	 */
	public boolean actualizarGrupoInv(byte[] grupo){
		return false;
	}

	/**
	 * 
	 * @param proyecto
	 */
	public boolean actualizarProyecto(byte[] proyecto){
		return false;
	}

	/**
	 * 
	 * @param ua
	 */
	public boolean actualizarUA(byte[] ua){
		return false;
	}

	/**
	 * 
	 * @param usuario
	 */
	public boolean actualizarUsuario(byte[] usuario){
		return false;
	}

	/**
	 * Método para almacenar el log en archivo
	 * @param log
	 */
	public boolean almacenarLogArchivo(String log){
		try{
            String filename= "log.txt";
            boolean append = true;
            FileWriter fw = new FileWriter(filename,append);

            fw.write(log + "\n");//appends the string to the file
            fw.close();
            return true;
        }catch(IOException ioe){
            System.err.println("IOException: " + ioe.getMessage());
            return false;
        }

	}

	/**
	 * 
	 * @param log
	 */
	public boolean almacenarLogBD(String cedula, String tipoOperacion, String estadoOperacion){
		
        if(ejeSQLAvanzado.conectar()){
            ejeSQLAvanzado.ejecutarActualizacion("insert into Log(Cedula_Usuario, Tipo_operacion, Estado_Operacion,fecha) values ('" + cedula + "','" + tipoOperacion+ "','" + estadoOperacion + "',now())");
            ejeSQLAvanzado.cerrarConexion();
        }else{
            System.out.println("No se pudo conectar");
        }
        
        return true;
	}

	/**
	 * 
	 * @param codigo
	 */
	public byte[] consultarGrupoInv(Integer codigo){
		return null;
	}

	/**
	 * 
	 * @param titulo
	 */
	public byte[] consultarProyecto(String titulo){
		return null;
	}

	/**
	 * 
	 * @param codigo
	 */
	public byte[] consultarUA(Integer codigo){
		return null;
	}

	/**
	 * 
	 * @param cedula
	 */
	public byte[] consultarUsuario(Integer cedula){
		return null;
	}

	/**
	 * 
	 * @param grupo
	 */
	public boolean crearGrupoInv(byte[] grupo){
		return false;
	}

	/**
	 * 
	 * @param proyecto
	 */
	public boolean crearProyecto(proyectosudp.src.Proyecto proyecto){
        try{
            if(ejeSQLAvanzado.conectar()){
                ResultSet rs = ejeSQLAvanzado.ejecutarConsultaRs("select * from proyecto where Titulo_Proyecto='" + proyecto.getTitulo() + "'");
                if(rs.next()){
                    ejeSQLAvanzado.ejecutarActualizacion("update Proyecto " +
                            " set Titulo_Proyecto='" + proyecto.getTitulo() + "',  " +
                            " Codigo_Unidad_Academica = '" + proyecto.getUnidadAcademica() + "', " +
                            " Tipo_Proyecto = '" + proyecto.getTipo() + "', " +
                            " Estado_Proyecto = '" + proyecto.getEstado() +"'" +
                            " where Titulo_Proyecto = '" + proyecto.getTitulo() + "'");
                    ejeSQLAvanzado.ejecutarActualizacion("insert into Log(Cedula_Usuario, Tipo_operacion, Estado_Operacion,fecha) values ('" + proyecto.getCedulaLog() + "', 'modificar proyecto','aceptada',now())");
                    almacenarLogArchivo(proyecto.getCedulaLog()+ "|modificar proyecto|"+ "aceptada|" + new Date());
                }else{
                    ejeSQLAvanzado.ejecutarActualizacion("insert into Proyecto(Titulo_Proyecto, Codigo_Unidad_Academica, Tipo_Proyecto, Estado_Proyecto) values ('" + proyecto.getTitulo() + "','" + proyecto.getUnidadAcademica() + "','" + proyecto.getTipo() + "','" + proyecto.getEstado() + "')");
                    ejeSQLAvanzado.ejecutarActualizacion("insert into Log(Cedula_Usuario, Tipo_operacion, Estado_Operacion,fecha) values ('" + proyecto.getCedulaLog() + "', 'crear proyecto','aceptada',now())");
                    almacenarLogArchivo(proyecto.getCedulaLog()+ "|crear proyecto|"+ "aceptada|" + new Date());
                }
                ejeSQLAvanzado.cerrarConexion();
            }else{
                System.out.println("No se pudo conectar");
            }

            return true;
        }catch(Exception e){

        }

		return false;
	}

	/**
	 * 
	 * @param ua
	 */
	public boolean crearUnidad(proyectosudp.src.UnidadAcademica unidad){
        try{
            if(ejeSQLAvanzado.conectar()){
                ResultSet rs = ejeSQLAvanzado.ejecutarConsultaRs("select * from Unidad_Academica where Codigo_Unidad_Academica=" + unidad.getCodigo());
                if(rs.next()){
                    ejeSQLAvanzado.ejecutarActualizacion("update Unidad_Academica    " +
                            " set Nombre_Unidad_Academica='" + unidad.getNombre() + "'" +
                            " where Codigo_Unidad_Academica = " + unidad.getCodigo());
                    ejeSQLAvanzado.ejecutarActualizacion("insert into Log(Cedula_Usuario, Tipo_operacion, Estado_Operacion,fecha) values ('" + unidad.getCedulaLog() + "', 'modificar Unidad','aceptada',now())");
                    almacenarLogArchivo(unidad.getCedulaLog()+ "|modificar Unidad|"+ "aceptada|" + new Date());
                }else{
                    ejeSQLAvanzado.ejecutarActualizacion("insert into Unidad_Academica(Codigo_Unidad_Academica, Nombre_Unidad_Academica) values (" + unidad.getCodigo() + ",'" + unidad.getNombre() + "')");
                    ejeSQLAvanzado.ejecutarActualizacion("insert into Log(Cedula_Usuario, Tipo_operacion, Estado_Operacion,fecha) values ('" + unidad.getCedulaLog() + "', 'crear unidad','aceptada',now())");
                    almacenarLogArchivo(unidad.getCedulaLog()+ "|crear Unidad|"+ "aceptada|" + new Date());
                }
                ejeSQLAvanzado.cerrarConexion();
            }else{
                System.out.println("No se pudo conectar");
            }

            return true;
        }catch(Exception e){

        }

		return false;
	}
        public boolean crearGrupoInv(proyectosudp.src.GrupoInvestigacion grupoInv){
        try{
            if(ejeSQLAvanzado.conectar()){
                ResultSet rs = ejeSQLAvanzado.ejecutarConsultaRs("select * from Grupo_Investigacion where Codigo_Grupo=" + grupoInv.getCodigoGrupoInvestigacion());
                if(rs.next()){
                    ejeSQLAvanzado.ejecutarActualizacion("update Grupo_Investigacion " +
                            " set Nombre_grupo='" + grupoInv.getNombreGrupoInvestigacion() + "',  " +
                            " Programa_Academico_Pertenece = " + grupoInv.getUnidadAcademica() + ", " +
                            " Nombre_Lider_grupo = '" + grupoInv.getNombreLiderGrupo() + "' " +
                            " where Codigo_Grupo = " + grupoInv.getCodigoGrupoInvestigacion());
                    ejeSQLAvanzado.ejecutarActualizacion("insert into Log(Cedula_Usuario, Tipo_operacion, Estado_Operacion,fecha) values ('" + grupoInv.getCedulaLog() + "', 'modificar Grupo Investigacion','aceptada',now())");
                    almacenarLogArchivo(grupoInv.getCedulaLog()+ "|modificar Grupo Investigacion|"+ "aceptada|" + new Date());
                }else{
                    ejeSQLAvanzado.ejecutarActualizacion("insert into Grupo_Investigacion(Codigo_Grupo, Nombre_grupo, Programa_Academico_Pertenece, Nombre_Lider_grupo) values (" + grupoInv.getCodigoGrupoInvestigacion() + ",'" + grupoInv.getNombreGrupoInvestigacion() + "'," + grupoInv.getUnidadAcademica() + ",'" + grupoInv.getNombreLiderGrupo() + "')");
                    ejeSQLAvanzado.ejecutarActualizacion("insert into Log(Cedula_Usuario, Tipo_operacion, Estado_Operacion,fecha) values ('" + grupoInv.getCedulaLog() + "', 'crear Grupo Investigacion','aceptada',now())");
                    almacenarLogArchivo(grupoInv.getCedulaLog()+ "|crear Grupo Investigacion|"+ "aceptada|" + new Date());
                }
                ejeSQLAvanzado.cerrarConexion();
            }else{
                System.out.println("No se pudo conectar");
            }

            return true;
        }catch(Exception e){

        }

		return false;
	}

	/**
	 * 
	 * @param usuario
	 */
	public boolean crearUsuario(proyectosudp.src.Usuario usuario){
        String priv = null;
        if(usuario.getPrivilegio().equals("Consulta")){
            priv = "C";
        }else
            priv = "E";
        try{
            if(ejeSQLAvanzado.conectar()){
                ResultSet rs = ejeSQLAvanzado.ejecutarConsultaRs("select * from Usuario where Cedula= " + usuario.getCedula());
                if(rs.next()){
                    ejeSQLAvanzado.ejecutarActualizacion("update Usuario " +
                            " set Nombre_Usuario='" + usuario.getNombre()+ "',  " +
                            " Rol = '" + usuario.getRol() + "', " +
                            " Privilegios = '" + priv+ "', " +
                            " Codigo_Unidad_Academica = '" + usuario.getUnidadAcademica() +"'" +
                            " where Cedula = " + usuario.getCedula());
                    ejeSQLAvanzado.ejecutarActualizacion("insert into Log(Cedula_Usuario, Tipo_operacion, Estado_Operacion,fecha) values ('" + usuario.getCedulaLog() + "', 'modificar usuario','aceptada',now())");
                    almacenarLogArchivo(usuario.getCedulaLog()+ "|modificar usuario|"+ "aceptada|" + new Date());
                }else{
                    ejeSQLAvanzado.ejecutarActualizacion("insert into Usuario(Cedula, Nombre_Usuario, Rol, Privilegios, Codigo_Unidad_Academica) values ('" + usuario.getCedula() + "','" + usuario.getNombre()+ "','" + usuario.getRol() + "','" + priv+ "','1')");
                    ejeSQLAvanzado.ejecutarActualizacion("insert into Log(Cedula_Usuario, Tipo_operacion, Estado_Operacion,fecha) values ('" + usuario.getCedulaLog() + "', 'crear usuario','aceptada',now())");
                    almacenarLogArchivo(usuario.getCedulaLog()+ "|crear usuario|"+ "aceptada|" + new Date());
                }
                ejeSQLAvanzado.cerrarConexion();
            }else{
                System.out.println("No se pudo conectar");
            }

            return true;
        }catch(Exception e){

        }

		return false;
	}

	public ArrayList<Object> listarGruposInv(){
            ArrayList<Object> respuesta= new ArrayList<Object>();
            try {
                if(ejeSQLAvanzado.conectar()){
                    ResultSet rs = ejeSQLAvanzado.ejecutarConsultaRs("select * from grupo_investigacion order by nombre_grupo");
                    while (rs.next()) {
                        GrupoInvestigacion gi = new GrupoInvestigacion();
                        gi.setCodigoGrupoInvestigacion(rs.getString("codigo_grupo"));
                        gi.setNombreGrupoInvestigacion(rs.getString("nombre_grupo"));
                        gi.setUnidadAcademica(rs.getString("programa_academico_pertenece"));
                        gi.setNombreLiderGrupo(rs.getString("nombre_lider_grupo"));
                        respuesta.add(gi);
    //                    break;
                    }
                    ejeSQLAvanzado.cerrarConexion();
                }else{
                    System.out.println("No se pudo conectar");
                }
            } catch (SQLException ex) {
                Logger.getLogger(Dao.class.getName()).log(Level.SEVERE, null, ex);
            }
        //System.out.println("salio");
        //System.out.println("----------------");
		return respuesta;
	}

	public ArrayList<Object> listarProyectos(){
            ArrayList<Object> respuesta= new ArrayList<Object>();
            try {
                if(ejeSQLAvanzado.conectar()){
                    ResultSet rs = ejeSQLAvanzado.ejecutarConsultaRs("select * from proyecto order by titulo_proyecto");
                    while (rs.next()) {
                        Proyecto pr = new Proyecto();
                        pr.setTitulo(rs.getString("titulo_proyecto"));
                        pr.setUnidadAcademica(rs.getString("codigo_unidad_academica"));
                        pr.setTipo(rs.getString("tipo_proyecto"));
                        pr.setEstado(rs.getString("estado_proyecto"));
                        respuesta.add(pr);
    //                    break;
                    }
                    ejeSQLAvanzado.cerrarConexion();
                }else{
                    System.out.println("No se pudo conectar");
                }
            } catch (SQLException ex) {
                Logger.getLogger(Dao.class.getName()).log(Level.SEVERE, null, ex);
            }
        //System.out.println("salio");
        //System.out.println("----------------");
		return respuesta;
	}

	public byte[] listarUAs(){
		return null;
	}

	public ArrayList<Object> listarUsuarios(){
        System.out.println("------------listarUsuarios------------");


        ArrayList<Object> respuesta= new ArrayList<Object>();
        try {
            if(ejeSQLAvanzado.conectar()){
                ResultSet rs = ejeSQLAvanzado.ejecutarConsultaRs("select * from Usuario order by nombre_usuario");
                while (rs.next()) {
                    Usuario usuario = new Usuario();
                    usuario.setCedula(rs.getString("cedula"));
                    usuario.setNombre(rs.getString("nombre_usuario"));
                    usuario.setPrivilegio(rs.getString("privilegios"));
                    usuario.setRol(rs.getString("rol"));
                    usuario.setUnidadAcademica(rs.getString("codigo_unidad_academica"));
                    respuesta.add(usuario);
//                    break;
                }
                ejeSQLAvanzado.cerrarConexion();
            }else{
                System.out.println("No se pudo conectar");
            }
        } catch (SQLException ex) {
            Logger.getLogger(Dao.class.getName()).log(Level.SEVERE, null, ex);
        }
        //System.out.println("salio");
        //System.out.println("----------------");
		return respuesta;
	}


    public Usuario consultarDatosUsuarios(String cedula){
        System.out.println("------------consultarDatosUsuarios------------");
        System.out.println(cedula);
        System.out.println("-------------");
        Usuario usuario = null;
        try {
            if(ejeSQLAvanzado.conectar()){
                ResultSet rs = ejeSQLAvanzado.ejecutarConsultaRs("select * from Usuario where cedula="+ cedula);
                if (rs.next()) {
                    usuario = new Usuario();
                    usuario.setCedula(rs.getString("cedula"));
                    usuario.setNombre(rs.getString("nombre_usuario"));
                    usuario.setPrivilegio(rs.getString("privilegios"));
                    usuario.setRol(rs.getString("rol"));
                    usuario.setUnidadAcademica(rs.getString("Codigo_Unidad_Academica"));
                }
                ejeSQLAvanzado.cerrarConexion();
            }else{
                System.out.println("No se pudo conectar");
            }
        } catch (SQLException ex) {
            Logger.getLogger(Dao.class.getName()).log(Level.SEVERE, null, ex);
        }
		return usuario;
	}
    public Proyecto consultarDatosProyecto(String titulo){
        System.out.println("------------consultarDatosProyectos------------");
        System.out.println(titulo);
        System.out.println("-------------");
        Proyecto proyecto = null;
        try {
            if(ejeSQLAvanzado.conectar()){
                ResultSet rs = ejeSQLAvanzado.ejecutarConsultaRs("select * from Proyecto where Titulo_Proyecto='"+ titulo +"'");
                if (rs.next()) {
                    proyecto = new Proyecto();
                    proyecto.setTitulo(rs.getString("Titulo_Proyecto"));
                    proyecto.setUnidadAcademica(rs.getString("Codigo_Unidad_Academica"));
                    proyecto.setTipo(rs.getString("Tipo_Proyecto"));
                    proyecto.setEstado(rs.getString("Estado_Proyecto"));
                }
                ejeSQLAvanzado.cerrarConexion();
            }else{
                System.out.println("No se pudo conectar");
            }
        } catch (SQLException ex) {
            Logger.getLogger(Dao.class.getName()).log(Level.SEVERE, null, ex);
        }
		return proyecto;
    }
    public UnidadAcademica consultarDatosUnidad(String codigo){
        UnidadAcademica unidad = null;
        try {
            if(ejeSQLAvanzado.conectar()){
                ResultSet rs = ejeSQLAvanzado.ejecutarConsultaRs("select * from Unidad_Academica where Codigo_Unidad_Academica="+ codigo +"");
                if (rs.next()) {
                    unidad = new UnidadAcademica();
                    unidad.setCodigo(rs.getString("Codigo_Unidad_Academica"));
                    unidad.setNombre(rs.getString("Nombre_Unidad_Academica"));
                }
                ejeSQLAvanzado.cerrarConexion();
            }else{
                System.out.println("No se pudo conectar");
            }
        } catch (SQLException ex) {
            Logger.getLogger(Dao.class.getName()).log(Level.SEVERE, null, ex);
        }
		return unidad;
    }
    public GrupoInvestigacion consultarDatosGrupoInv(String codigo){
        System.out.println("------------consultarDatosGrupoInv------------");
        System.out.println(codigo);
        System.out.println("-------------");
        GrupoInvestigacion grupoInv = null;
        try {
            if(ejeSQLAvanzado.conectar()){
                ResultSet rs = ejeSQLAvanzado.ejecutarConsultaRs("select * from Grupo_investigacion where Codigo_grupo="+ codigo);
                if (rs.next()) {
                    grupoInv = new GrupoInvestigacion();
                    grupoInv.setCodigoGrupoInvestigacion(rs.getString("Codigo_grupo"));
                    grupoInv.setNombreGrupoInvestigacion(rs.getString("Nombre_grupo"));
                    grupoInv.setUnidadAcademica(rs.getString("Programa_Academico_Pertenece"));
                    grupoInv.setNombreLiderGrupo(rs.getString("Nombre_Lider_Grupo"));
                }
                ejeSQLAvanzado.cerrarConexion();
            }else{
                System.out.println("No se pudo conectar");
            }
        } catch (SQLException ex) {
            Logger.getLogger(Dao.class.getName()).log(Level.SEVERE, null, ex);
        }
		return grupoInv;
    }
    public String consultarUnidades(){
        System.out.println("------Unidades-------");
        String resultado = new String("");
        try {
            if(ejeSQLAvanzado.conectar()){
                ResultSet rs = ejeSQLAvanzado.ejecutarConsultaRs("select * from Unidad_academica order by Nombre_Unidad_Academica");
                while(rs.next()) {
                    resultado+=rs.getString("Codigo_Unidad_Academica")+" - "+rs.getString("Nombre_Unidad_Academica")+"#";
                }
                ejeSQLAvanzado.cerrarConexion();
            }else{
                System.out.println("No se pudo conectar");
            }
        } catch (SQLException ex) {
            Logger.getLogger(Dao.class.getName()).log(Level.SEVERE, null, ex);
        }
		return resultado;
	}

	/**
	 * 
	 * @param idUsuario
	 */
	public char verificarPrivilegios(String idUsuario){
        char privilegios='N';
        String respuesta="";
        if(ejeSQLAvanzado.conectar()){
            respuesta=ejeSQLAvanzado.ejecutarConsulta("select Privilegios from Usuario where Cedula = "+idUsuario);
            if(respuesta.trim().equals("C")||respuesta.trim().equals("E")){ //si los privilegios son C o E, se almacena en la variable de respuesta.
                privilegios = respuesta.charAt(0);
            }
            ejeSQLAvanzado.cerrarConexion();
        }else{
            System.out.println("No se pudo conectar");
        }

		return privilegios;
	}

    public ArrayList<Object> listarUnidades() {
        ArrayList<Object> respuesta= new ArrayList<Object>();
        try {
            if(ejeSQLAvanzado.conectar()){
                ResultSet rs = ejeSQLAvanzado.ejecutarConsultaRs("select * from unidad_academica order by nombre_unidad_academica");
                while (rs.next()) {
                    UnidadAcademica ua = new UnidadAcademica();
                    ua.setCodigo(rs.getString("codigo_unidad_academica"));
                    ua.setNombre(rs.getString("nombre_unidad_academica"));
                    respuesta.add(ua);
//                    break;
                }
                ejeSQLAvanzado.cerrarConexion();
            }else{
                System.out.println("No se pudo conectar");
            }
        } catch (SQLException ex) {
            Logger.getLogger(Dao.class.getName()).log(Level.SEVERE, null, ex);
        }
        //System.out.println("salio");
        //System.out.println("----------------");
		return respuesta;
    }
}//end Dao
